//
// Created by 29122 on 2021/4/2.
//

#include <stdbool.h>
#include "stdio.h"
#include "stdlib.h"

typedef struct LNode{
    int data;
    struct LNode *next;  //指向下一个结点
} LNode,*LinkList;


bool InitList(LinkList L){
    L = (LNode*)malloc(sizeof(LNode));
    if(L==NULL)
        return false;
    L->next=NULL;
    return true;
}

bool ListInsert(LinkList L,int i,int e){   //头结点
    if(i<1)
        return false;
    LNode *p; //指针p指向当前扫描到的结点
    int j = 0; //当前p指向的第几个结点
    p=L;  //L指向头结点，头结点是第0个结点（不存数据）
    while(p!=NULL&&j<i-1){  //循环找到i-1个结点
        p=p->next;
        j++;
    }
    if(p==NULL)  //i值不合法
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;     //将结点s连接到p之后
    return true;
}

bool ListInserted(LinkList L,int i,int e){  //不带头结点的插入
    if(i<1)
        return false;
    if(i==1){ //插入第1个结点的操作与其他结点操作不同
        LNode *s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        s->next=L;
        L=s;  //头指针指向新结点
        return true;
    }
    LNode *p;  //指针p指向当前扫描的结点
    int j=1; //当前指向第几个结点
    p=L;   //p指向第一个结点（不是头结点）
    while(p!=NULL&&j<i-1){  //循环找到第i-1个结点
        p=p->next;
        j++;
    }
    if(p==NULL)  //i值不合法
        return false;
    LNode *s= (LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

//指定结点的后插操作
bool InsertNextNode(LNode *p,int e){
    if(p==NULL)
        return false;
    LNode *s =(LNode *)malloc(sizeof(LNode));
    if(s==NULL)  //内存分配失败
        return false;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

//前插操作
bool InsertprioNode(LNode *p,int e){
    if(p==NULL)
        return false;
    LNode *s =(LNode *)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->next=p->next;
    p->next=s;   //新结点s连到之后
    s->data=p->data;  //将p中元素复制到s中
    p->data=e;   //p中元素覆盖为e
    return true;
}


//按位序删除（带头结点）
bool ListDelete(LinkList L,int i,int e){
    if(i<1)
        return false;
    LNode *p;
    int j=0;
    p=L;
    while (p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    if(p==NULL)
        return false;
    if(p->next=NULL)
        return false;
    LNode *q=p->next;  //令q指向被删除的结点
    e=q->data;   //用e返回元素的值
    p->next=q->next;  //将*q结点从链中中断
    free(q);  //释放结点空间
    return true;
}

//指定结点删除
bool DeleteNode(LNode *p){
    if(p==NULL)
        return false;
    LNode *q=p->next;  //令q指向*p的后继结点
    p->data=p->next->data;  //和后继结点交换数据域
    p->next=q->next;  //将*q结点从链中断开
    free(q); //释放后继结点的存储空间
    return true;
}

//按值删除
void DeleteElment(LinkList L,int e){
    LNode *p =L;
    while(p->next){
        if(p->next->data==e){
            LNode *q=p->next;
            p->next = q->next;
            free(q);
        } else{
            p=p->next;
        }
    }
}

void DeleteElmentone(LinkList L,int e){
    LNode *pre = L,*p = pre->next;
    while(p){
        if(p->data==e){
            LNode *q = p;
            p=p->next;
            pre->next=q->next;
            free(q);
        }else{
            pre=p;
            p=p->next;
        }
    }
}

//删除重复元素
void DeleteRepetition(LinkList L){
    LNode *p = L->next;
    while(p&&p->next){
        if(p->next->data==p->data){
            LNode *q = L->next;
            p->next=q->next;
            free(q);
        }else{
            p=p->next;
        }
    }
}

//找出 X 中第一个不在 Y 中出现的字符
char find(LinkList X,LinkList Y){
    LNode *p = X->next,*q;
    while(p){
        q=Y->next;
        while(q){
            if(p->data=q->data) break;
            else q=q->next;
        }
        if(!q) return p->data;
        else q=q->next;
    }
}



LNode * ElemGet(LinkList L,int i){  //带头结点
    if(i<0)
        return false;
    LNode *p;
    int j=0;
    p=L;
    while(p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;
}

LNode * GetElem(LinkList L,int i){  //LinkList 强调的是一个链表  而LNode强调的是结点
    int j=1;
    LNode *p=L->next;
    if(i==0)
        return L;
    if(i<1)
        return NULL;
    while(p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;
}

//按值查找
LNode * LocateElem(LinkList L,int e){
    LNode *p=L->next;
    //从第1个结点开始查找数据域
    while (p!=NULL&&p->data!=e)
        p =p->next;
    return p;
}


//表长
int Length(LinkList L){
    int len =0;
    LNode *p=L;
    while(p->next!=NULL){
        p=p->next;
        len++;
    }
    return len;
}

main(){
    LinkList  L;
    InitList(L);
}

